function [F] = symsum(expr, var, a, b)
%SYMSUM - 符号级数求和.
%
% 语法:
%   F = symsum(expr, var, [a, b]);
%   F = symsum(expr, var, a, b);    - 计算级数 expr 关于求和索引 var 从下界 a 到上界 b 的和.
%   F = symsum(expr, var);          - 计算级数 expr 关于求和索引 var 的不定总和 (反差分).
%
% 示例:
% >> sp = sympy_sp;
% >> [k, n, x] = syms("k n x");
% >> symsum(k, k, 1, n)
% n**2/2 + n/2
% >> symsum(1/k^2, k, [1, inf])
% pi**2/6
% >> symsum(x^k/sp.factorial(k), k, 1, inf)
% x*(exp(x)/x - 1/x)
% >> symsum(k, k)
% k*(k - 1)/2
% >> F = symsum(k*x^k, k, 1, 8)
% 8*x**8 + 7*x**7 + 6*x**6 + 5*x**5 + 4*x**4 + 3*x**3 + 2*x**2 + x
% >> subs(F, 2)
% 3586
%
    narginchk(2, 4);
    sp = sympy_sp;
    if nargin == 4
        F = sp.summation(expr, pytuple(var, a, b));
    elseif nargin == 3
        if numel(a) ~= 2
            error("求和界限错误.");
        end
        [a, b] = deal(a(1), a(2));
        F = sp.summation(expr, pytuple(var, a, b));
    elseif nargin == 2
        py = pyroot;
        f = sp.Function('f');
        [n, C0] = syms("n C0");
        rexpr = f(n + 1) - f(n) - subs(expr, var, n);
        F = sp.rsolve(rexpr, f(n));
        F = subs(F, n, var);
        F = subs(F, C0, 0);
    end
end

